<?php
/**
 * @class		User
 * @ingroup		users_models
 * @brief		Model của đối tượng User, bao gồm các phương thức phục vụ cho việc giao tiếp với bảng dữ liệu users
 * @author		BaoNN
 * @version		1.0
 * @date		2009-2010
 */
class User extends AppModel {
	/**
	 @var $name
	 @brief Tên của model
	 */
	var $name = 'User';
	
	/**
	 * @var $actsAs
	 * @brief Biến dùng để cấu hình
	 */
	var $actsAs = array(
		'ExtendedConfiguration'	=> array(
			'configFolder'		=>	'users',
			'cacheName'			=> 'user_configs',
			'configFilename'	=>	'users.config',
		),
	);
	
	/**
	 * @var $validate
	 * @brief Biến dùng để ràng buộc dữ liệu đầu vào
	 */
	var $validate = array(
		'first_name'		=> array(
			'rule'			=> 'notEmpty',
			'message'		=> 'Tên không được dể trống'
		),
		'last_name'		=> array(
			'rule'			=> 'notEmpty',
			'message'		=> 'Họ và tên đệm không được để trống'
		),
		'username'		=> array(
				'rule'		=> 'notEmpty',
				'message'	=> 'Tên đăng nhập không được để trống'
		),
		'password'		=> array(
			'password-rule-1'	=> array(
				'rule'		=> array('minLength', 5),
				'message'	=> 'Mật khẩu phải ít nhất 5 ký tự'
			)
		),
		'email'			=> array(
			'nameRule-1'	=> array(
				'rule'		=> 'email',
				'message' => 'Bạn vui lòng nhập đúng định dạng email. Ex: name@yahoo.com'
			),
			'nameRule-2'	=> array(
				'rule'		=> 'notEmpty',
				'message'	=> 'Email không được để trống!'
			),
			'nameRule-3'	=> array(
				'rule'		=> 'isUnique',
				'message'	=> 'Email này đã tồn tại trong CSDL!'
			)
			
		)
	);
	
	/**
	 * Phương thức changePassword($user_id, $oldPass, $newPassword, $reNewPassword) dùng để thay đổi mật khẩu của người dùng
	 * 
	 * @param $user_id int Mã người dùng
	 * @param $oldPass string Mật khẩu cũ
	 * @param $newPassword string Mật khẩu mới
	 * @param $reNewPassword string Xác nhận mật khẩu mới
	 * @return true nếu việc thay đổi mật khẩu thành công
	 * @exception OldPasswordInvalid Ném ra thông báo lỗi trong trường hợp mật khẩu cũ không hợp lệ
	 * @exception CantSavePassword Ném ra thông báo lỗi trong trường hợp không thể lưu được mật khẩu
	 */	
	function changePassword($user_id, $oldPass, $newPassword, $reNewPassword) {
		if (strlen($newPassword) < 5) {
			throw new Exception(__("Độ dài của mật khẩu phải ít nhất 5 ký tự!", true));
		} else if ($newPassword != $reNewPassword) {
			throw new Exception(__("Hai mật khẩu mà bạn vừa nhập vào không trùng khớp!", true));
		} else {
			$this->Behaviors->attach('Containable');
			$this->contain();
            //throw new Exception(__($user_id, true));
			if ($this->find('count', array(
                'conditions' => array(
    				'id'	=>	$user_id,
    				'password'	=>	md5($oldPass)
                )
            )))
            {
                // Thay đổi mật khẩu
                if ($this->updateAll(
					array('password'	=>	"'".md5($newPassword)."'"), // fields
					array('id'	=>	$user_id) // conditions
				)) 
                {
					return true;
				} else {
					throw new Exception(__("Không thể thay đổi mật khẩu cho tài khoản này!", true));
				}
			} else {
				throw new Exception(__("Mật khẩu cũ không hợp lệ!", true));
			}
		}
	}
	
	/**
	 * Phương thức adminChangePassword($user_id, $newPassword, $reNewPassword) dùng để thay đổi mật khẩu bởi người quản trị
	 * 
	 * @param $user_id int Mã người dùng
	 * @param $newPassword string Mật khẩu mới
	 * @param $reNewPassword string Xác nhận mật khẩu mới
	 * @return true nếu việc thay đổi mật khẩu thành công
	 * @exception Ném ra thông báo lỗi trong trường hợp thay đổi mật khẩu không thành công
	 */	
	function adminChangePassword($user_id, $newPassword, $reNewPassword) {
		if (strlen($newPassword) < 5) {
			throw new Exception(__("Độ dài của mật khẩu phải ít nhất 5 ký tự!", true));
		} else if ($newPassword != $reNewPassword) {
			throw new Exception(__("2 mật khẩu mà bạn vừa nhập vào không trùng khớp!", true));
		} else {
			$this->Behaviors->attach('Containable');
			$this->contain();
			$this->recursive = -1;
			if ($this->updateAll(
				array('password'	=>	"'".md5($newPassword)."'"), // fields
				array('id'	=>	$user_id) // conditions
			)) {
				return true;
			} else {
				throw new Exception(__("Không thể thay đổi mật khẩu cho tài khoản này!", true));
			}
		}
	}
	
	function getUserInfo($userId, $fields = array(), $options = array()) {
		Cache::config('user_profile');
		$user = Cache::read("id.{userId}");
		
		if (empty($user)) {
			$user = $this->find('first', array(
				'conditions'	=>	array("{$this->name}.id"	=>	userId),
				'contain'		=>	array()
			));
			
			// Cache data
			Cache::write("id.{$user['User']['id']}", $user);
			Cache::write("username.{$user['User']['username']}", $user);
		}
		
		return $user;
	}
	
	function setOnlineUser($me) {
		$this->user = $me;
		$index = "Guest";
		if (!empty($this->user)) {
			$index = $this->user['username'];
		}
		$cacheName = 'cp_online_users';
		$loaded = Configure::load($cacheName);
					
		if ($loaded !== false) {
			$config = Configure::read('CPOnlineUsers');
			$this->configs['CPOnlineUsers'] = $config;
			
			// Xóa user đã inactive hơn 30 phút
			$tmp = array();
			foreach ($this->configs['CPOnlineUsers'] as $key => $item) {
				if (strtotime($item['last_accessed']) < (time() - 30 * 60)) {
					continue;
				} else {
					$tmp[$key] = $item;
				}
			}
			$this->configs['CPOnlineUsers'] = $tmp;
			$this->configs['CPOnlineUsers'][$index]['user_id'] = $this->user['id'];
			$this->configs['CPOnlineUsers'][$index]['username'] = $this->user['username'];
			$this->configs['CPOnlineUsers'][$index]['first_name'] = $this->user['first_name'];
			$this->configs['CPOnlineUsers'][$index]['last_name'] = $this->user['last_name'];
			$this->configs['CPOnlineUsers'][$index]['last_accessed'] = date("Y-m-d H:i:s");
			$oldDebug = Configure::read('debug');
		
			// Đảm bảo cache được lưu
			Configure::write('debug',1);
			Configure::delete('CPOnlineUsers');
		
			// Lưu vào cache
			Configure::store('CPOnlineUsers', $cacheName, $this->configs['CPOnlineUsers']);
			Configure::write('debug', $oldDebug);
		} else {
			$this->configs['CPOnlineUsers'] = array();
			$this->configs['CPOnlineUsers'][$index]['user_id'] = $this->user['id'];
			$this->configs['CPOnlineUsers'][$index]['username'] = $this->user['username'];
			$this->configs['CPOnlineUsers'][$index]['first_name'] = $this->user['first_name'];
			$this->configs['CPOnlineUsers'][$index]['last_name'] = $this->user['last_name'];
			$this->configs['CPOnlineUsers'][$index]['last_accessed'] = date("Y-m-d H:i:s");
		
			$oldDebug = Configure::read('debug');
			
			// Đảm bảo cache được lưu
			Configure::write('debug',1);
			Configure::delete('CPOnlineUsers');
			// Lưu vào cache
			Configure::store('CPOnlineUsers', $cacheName, $this->configs['CPOnlineUsers']);
			Configure::write('debug', $oldDebug);
		}
	}
	function onlineUsers() {
		$cacheName = 'cp_online_users';
		$loaded = Configure::load($cacheName);
		if ($loaded !== false) {
			$config = Configure::read('CPOnlineUsers');
			if (count($config)) {
				return $config;
			} else {
				return array();
			}
		} else {
			return array();
		}
	}
	
	function createUser($user) {
		// Kiểm tra xem có tồn tại username?
		// Nếu hàm findCount trả về 0 thì chưa tồn tại username
		if($this->find('count', array(
			'conditions'	=> array(
				"username" => $user['User']['username'])
			))
		) {
			throw new Exception(sprintf(__('Thành viên (%s) đã tồn tại.', true), $user['User']['username']));
		}
		
		// Kiểm tra để xác nhận password người dùng nhập vào có chính xác
		if($user['User']['password'] != $user['User']['re_password']){
			throw new Exception(__('Hai mật khẩu mà bạn nhập vào không trùng khớp.',true));
		}
		
		$this->create($user);
		$fields = $this->invalidFields();
		
		if (empty($fields)) {
			$user['User']['password']= md5($user['User']['password']);
			if (!$this->save($user)) {
				throw new Exception(__("Không thể tạo mới thành viên. Bạn vui lòng thử lại!", true));
			}
		} else {
			throw new Exception(__("Không thể tạo mới thành viên. Bạn vui lòng thử lại!", true));
		}
	}
}
?>